#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>

typedef long long ll;

const ll MOD = 998244353;

ll pow(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b & 1) ret = ret * a % MOD;
		a = a * a % MOD;
		b >>= 1;
	}
	return ret;
}

template<const int SIZE>
struct Matrix {
	ll mat[SIZE][SIZE];
	void clear() {
		for(int i = 0; i < SIZE; i++) {
			for(int j = 0; j < SIZE; j++) {
				mat[i][j] = 0;
			}
		}
	}
	friend Matrix operator * (const Matrix &lhs, const Matrix &rhs) {
		Matrix ans;
		ans.clear();
		for(int i = 0; i < SIZE; i++) {
			for(int j = 0; j < SIZE; j++) {
				for(int k = 0; k < SIZE; k++) {
					ans.mat[i][k] += lhs.mat[i][j] * rhs.mat[j][k];
					ans.mat[i][k] %= MOD;
				}
			}
		}
		return ans;
	}
	void print() const {
		for(int i = 0; i < SIZE; i++) {
			for(int j = 0; j < SIZE; j++) {
				fprintf(stderr, "%lld%c", mat[i][j], j + 1 < SIZE ? ' ' : '\n');
			}
		}
	}
};

/* data */

int n, m;

void solve1() {
	static std::vector<int> pmt;
	static std::map<std::vector<int>, int> idx;
	static Matrix<120> trans, ans;

	for(int i = 1; i <= n; i++) {
		pmt.push_back(i);
	}
	do {
		int x = idx.size();
		idx[pmt] = x;
	} while(std::next_permutation(pmt.begin(), pmt.end()));
	for(int i = 1; i <= n; i++) {
		pmt[i - 1] = i;
	}
	int x = 0;
	do {
		std::vector<int> cp = pmt;
		for(int i = 0; i < n; i++) {
			if(i > 0)
				std::swap(cp[i], cp[i - 1]);
			trans.mat[x][idx[cp]]++;
		}
		x++;
	} while(std::next_permutation(pmt.begin(), pmt.end()));
	ans.mat[0][0] = 1;
	while(m) {
		if(m & 1) ans = ans * trans;
		trans = trans * trans;
		m >>= 1;
	}
	printf("%lld\n", ans.mat[0][0]);
}

void solve0() {
	scanf("%d %d", &n, &m);
	if(n <= 5) {
		solve1();
	}
}

int main() {
	freopen("drama.in", "r", stdin);
	freopen("drama.out", "w", stdout);
	solve0();
	fclose(stdin);
	fclose(stdout);
	return 0;
}